package com.example.demo.zhoushengwen.configurer;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.springframework.util.StreamUtils;

/**
 * 
 * 从请求体中获取参数请求包装类：<br>
 * @author nick
 * @version 5.0 since 2018年9月5日
 */
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper
{
    
    private byte[] requestBody = null;//用于将流保存下来
    
    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request)
        throws IOException
    {
        super(request);
        requestBody = StreamUtils.copyToByteArray(request.getInputStream());
    }
    
    @Override
    public ServletInputStream getInputStream()
        throws IOException
    {
        
        final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);
        
        return new ServletInputStream()
        {
            
            @Override
            public int read()
                throws IOException
            {
                return bais.read();
            }
            
            @Override
            public boolean isFinished()
            {
                return false;
            }
            
            @Override
            public boolean isReady()
            {
                return false;
            }
            
            @Override
            public void setReadListener(ReadListener readListener)
            {
                
            }
        };
    }
    
    @Override
    public BufferedReader getReader()
        throws IOException
    {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
}